function isArrayLikeObject(arr) {
  // 不是对象直接返回
  if (arr == null || typeof arr !== "object") return false;

  const lengthMaxValue = Math.pow(2, 53) - 1;
  //  是否有 length 属性
  if (!Object.prototype.hasOwnProperty.call(arr, "length")) return false;
  //  length 属性是否是number类型
  if (typeof arr.length != "number") return false;
  //使用 isFinite() 在检测无穷数
  if (!isFinite(arr.length)) return false;
  // 构造函数等于Array
  if (Array === arr.constructor) return false;

  // 长度有效值
  if (arr.length >= 0 && arr.length < lengthMaxValue) {
    return true;
  } else {
    return false;
  }
}

console.log(isArrayLikeObject(null)); // false

console.log(isArrayLikeObject({ 0: "a", 1: "b", length: 2 })); // true

console.log(isArrayLikeObject({ 0: 1, 2: 3, length: "" })); // false

console.log(isArrayLikeObject({ 0: 1, 2: 3 })); // false

console.log(isArrayLikeObject([1, 2])); // false
